package com.sam.e_annotation;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

/**
 * 通知类
 *
 * @Author: SamZhao
 * @Description:
 * @Date: 2018/01/13 14:47
 */
@Aspect //表示该类是一个通知类
public class MyAdvice {

    @Pointcut("execution(* com.sam.service.impl.UserServiceImpl.*(..))")
    public void pc(){
    }

    //前置通知
    //指定该方法是前置通知 并指定切入点
    @Before("MyAdvice.pc()")
    public void before() {
        System.out.println("这是前置通知...");
    }

    //后置通知（如果出现异常 不会调用）
    @AfterReturning("MyAdvice.pc()")
    public void afterReturning() {
        System.out.println("这是后置通知（如果出现异常 不会调用）...");
    }

    //环绕通知
    @Around("MyAdvice.pc()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("这是环绕通知之前部分...");
        Object object = joinPoint.proceed();//调用目标方法
        System.out.println("这是环绕通知之后部分...");
        return object;
    }

    //异常拦截通知
    @AfterThrowing("execution(* com.sam.service.impl.UserServiceImpl.*(..))")
    public void afterException() {
        System.out.println("这是异常拦截通知...");
    }

    //后置通知（无论是否出现异常 都会调用）
    @After("execution(* com.sam.service.impl.UserServiceImpl.*(..))")
    public void after() {
        System.out.println("这是后置通知（无论是否出现异常 都会调用）...");
    }
}
